package br.com.velp.vskygeo.controller;

import br.com.velp.vskygeo.util.GoogleMapsUtil;
import br.com.velp.vskygeo.util.GoogleMapsUtil.GoogleGeoCodeResponse.Results;
import br.com.velp.vskygeo.util.NormalizacaoUtil;
import com.google.gson.JsonSyntaxException;
import java.io.IOException;
import java.io.Serializable;
import org.lindbergframework.spring.scope.AccessScoped;
import org.primefaces.model.map.DefaultMapModel;
import org.primefaces.model.map.LatLng;
import org.primefaces.model.map.MapModel;
import org.primefaces.model.map.Marker;
import org.springframework.stereotype.Controller;

/**
 *
 * @author Eduardo
 */
@Controller("controllerVisualizarGmaps")
@AccessScoped
public class ControllerVisualizarGoogleMaps implements Serializable {

    private MapModel mapModel;
    private Results[] resultados;
    private Double maiorLatitude;
    private Double maiorLongitude;
    private int zoom;
    
    private void initialize() {
        
        this.mapModel = new DefaultMapModel();
        this.zoom = 20;
        this.maiorLatitude = 0.0;
        this.maiorLongitude = 0.0;
        
    }

    public void montarResultados() {

        initialize();

        if (this.resultados == null) {
            return;
        }

        for (Results resultado : this.resultados) {
            montarPontoNoMapa(resultado);
        }

    }

    public void exbirMapa(String endereco, String municipio) throws JsonSyntaxException, IOException {

        initialize();
        String enderecoNormalizado = NormalizacaoUtil.removerAcentuacao(endereco);
        
        this.resultados = GoogleMapsUtil.buscarEnderecos(enderecoNormalizado);
        
        if (this.resultados.length == 0) {
            this.resultados = GoogleMapsUtil.buscarEnderecos(municipio);
            this.zoom = 15;
        }
        
        for (Results resultado : this.resultados) {
            montarPontoNoMapa(resultado);
        }

    }

    public void montarPontoNoMapa(Results resultado) {

        Double latitude = Double.parseDouble(resultado.getGeometry().getLocation().getLat());
        Double longitude = Double.parseDouble(resultado.getGeometry().getLocation().getLng());

        LatLng latLong = new LatLng(latitude, longitude);

        Marker marker = new Marker(latLong);
        marker.setTitle(resultado.formatted_address);

        this.mapModel.addOverlay(marker);

        if (latitude < this.maiorLatitude) {
            this.maiorLatitude = latitude;
        }

        if (longitude < this.maiorLongitude) {
            this.maiorLongitude = longitude;
        }

    }

    // <editor-fold desc="GETTERS AND SETTERS" defaultstate="collapsed">            
    public MapModel getMapModel() {
        montarResultados();
        return mapModel;
    }

    public void setMapModel(MapModel mapModel) {
        this.mapModel = mapModel;
    }

    public Results[] getResultados() {
        return resultados;
    }

    public void setResultados(Results[] resultados) {
        this.resultados = resultados;
    }

    public String getMaiorLatLong() {
        if (this.maiorLatitude == null || this.maiorLongitude == null) {
            return null;
        }
        return this.maiorLatitude.toString().concat(",").concat(this.maiorLongitude.toString());
    }

    public int getZoom() {
        return zoom;
    }

    public void setZoom(int zoom) {
        this.zoom = zoom;
    }
    // </editor-fold>
}
